package com.cg.ai.model;

import dev.langchain4j.community.model.dashscope.QwenChatModel;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.community.model.dashscope.QwenStreamingChatModel;
import dev.langchain4j.model.chat.listener.ChatModelListener;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * 通义千问聊天模型配置
 * 自定义配置聊天模型参数
 */
@Configuration
@ConfigurationProperties(prefix = "langchain4j.community.dashscope.chat-model")
@Data
public class QwenChatModelConfig {

    private String modelName;
    private String apiKey;

    @Autowired
    private ChatModelListener chatModelListener;

    /**
     * 创建自定义的通义千问聊天模型Bean
     * @return 配置好的ChatModel实例
     */
    @Bean
    public ChatModel myQwenChatModel() {
        return QwenChatModel.builder()
                .apiKey(apiKey)
                .modelName(modelName)
                .temperature(0.7F) // 设置创造性参数
                .maxTokens(2000)  // 设置最大输出token数，避免回复被截断
                .topP(0.8)        // 设置核采样参数
                .listeners(List.of(chatModelListener))
                .build();
    }

    /** 面试会话用：提高温度，更像真人 */
    @Bean
    public ChatModel interviewQwenChatModel() {
        return QwenChatModel.builder()
                .apiKey(apiKey)
                .modelName(modelName)
                .temperature(0.95F)
                .maxTokens(2000)
                .topP(0.9)
                .listeners(List.of(chatModelListener))
                .build();
    }

    /** 面试会话流式模型：低温度版本 */
    @Bean
    public StreamingChatModel interviewQwenStreamingChatModel() {
        return QwenStreamingChatModel.builder()
                .apiKey(apiKey)
                .modelName(modelName)
                .temperature(0.2F)
                .build();
    }
}

